package com.color.admin.common.core.utils.web;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author HaiQiu
 * @date 2021/11/19
 * token工具
 */
public class TokenUtils {

    /**
     * 加密密钥
     */
    private final static String SECRET = "com.color.core.secret";

    /**
     * token Key（获取token）
     */
    public final static String TOKEN_KEY = "Authorization";

    /**
     * 过期时间，单位秒
     */
    private final static Long EXPIRATION = 24 * 60 * 60L;

    /**
     * token令牌前缀
     */
    public final static String PREFIX = "Bearer";


    /**
     * 创建token
     *
     * @param userId   用户ID
     * @param username 用户名
     * @return token
     */
    public static String generateToken(String userId, String username) {
        HashMap<String, Object> header = new HashMap<>();
        header.put("typ", "JWT");
        header.put("alg", "HS256");

        Map<String, Object> claims = new HashMap<>();
        claims.put("username", username);
        claims.put("userId", userId);

        String token = Jwts.builder()
                .setHeader(header)
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION * 1000))
                .signWith(SignatureAlgorithm.HS512, SECRET)
                .compact();
        return token;
    }

    /**
     * 检验token是否有效
     *
     * @param token token
     * @return true有效，false无效
     */
    public static boolean validateToken(String token) {
        //去掉前缀
        String trimToken = token.replaceAll(PREFIX, "").trim();
        return !isTokenExpired(trimToken);
    }

    /**
     * 获取token载荷
     *
     * @param token token
     * @return 载荷
     */
    private static Claims getClaimsFormToken(String token) {
        Claims claims = null;
        try {
            claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(removePrefix(token)).getBody();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return claims;
    }

    /**
     * 检验token是否过期
     *
     * @param token token
     * @return true过期，false未过期
     */
    private static boolean isTokenExpired(String token) {
        Claims claims = getClaimsFormToken(removePrefix(token));
        if (claims == null) {
            return true;
        }
        return claims.getExpiration().before(new Date());
    }


    /**
     * 根据token获取用户名
     *
     * @param token token
     * @return 用户名
     */
    public static String getUsernameFormToken(String token) {
        Claims claims = getClaimsFormToken(removePrefix(token));
        return (String) claims.get("username");
    }

    /**
     * 根据token获取用户ID
     *
     * @param token token
     * @return 用户ID
     */
    public static String getUserIdFormToken(String token) {
        Claims claims = getClaimsFormToken(removePrefix(token));
        return (String) claims.get("userId");
    }

    public static String removePrefix(String token){
        //去掉前缀
        String trimToken = token.replaceAll(PREFIX, "").trim();
        return trimToken;
    }

}
